/*
 * ComponenteDistribuidor.java
 *
 * Copyright 2011 Universidad Francisco de Paula Santander (UFPS).
 * Todos los Derechos Reservados.
 * Creado el 15/03/2011, 06:00:05 PM
 */
package com.ufps.cuatro.modelo.representacion.componente;

import java.awt.GridBagConstraints;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;

import com.ufps.cuatro.controlador.render.UtilRender;
import com.ufps.cuatro.modelo.asistente.UtilAsistente;
import com.ufps.cuatro.modelo.old.ComponenteBeans;
import com.ufps.cuatro.modelo.representacion.Distribucion;
import com.ufps.cuatro.modelo.representacion.EventoOyente;
import com.ufps.cuatro.modelo.representacion.FabricaBeans;
import com.ufps.cuatro.modelo.representacion.MenuPane;
import com.ufps.cuatro.modelo.representacion.OptionMenuPane;
import com.ufps.cuatro.modelo.representacion.Oyente;
import com.ufps.cuatro.modelo.representacion.Plantilla;
import com.ufps.cuatro.modelo.representacion.PlantillaCombo;
import com.ufps.cuatro.modelo.representacion.TipoOrigen;
import com.ufps.cuatro.modelo.representacion.UtilRepresentacion;
import com.ufps.cuatro.util.Utileria;
import com.ufps.cuatro.util.base.ComponenteBaseStandar;
import com.ufps.cuatro.util.generadores.GeneradorComponentes;
import com.ufps.cuatro.util.generadores.codeobject.CodeContextLine;
import com.ufps.cuatro.util.model.MyTableModelDistribucionComponentes;

/**
 * <i><b>ComponenteDistribuidor:</b></i>Esta Clase abstracta es la Base de los Componentes
 * Distribuidores es decir aquellos Componentes que contienen otros Componentes para 
 * representar un área de la interfaz gráfica.
 * Provee propiedades para adminstrar grupos de Componentes y sus respectivas
 * representaciones.
 * 
 * @author Carlos A. Torres C. - Dolly E. Guerrero. <https://code.google.com/p/tesis4dor/>
 * @version 1.0 07/10/08
 * @see Componente 
 * @see Distribucion 
 * @see OutputSourceCode
 * @see FabricaBeans
 */
public abstract class ComponenteDistribuidor extends Componente implements Distribucion, FabricaBeans{
    private static final long serialVersionUID = 7532374294402647179L;    
    /**
     * Serie Númerica para la generación de id de Objetos.
     */
    public static int serialIdComponenteDistribuidor;            
    private int idClaseComponenteDistribuidor;
    /**
     * Determina el <code>TipoOrigen</code> del <code>Componente</code>, es decir 
     * el modo por el cual fue creado. Los Modos pueden ser:
     * <ol>
     *  <li><code>Base</code></li>
     *  <li><code>Personalizado</code></li>
     * </ol>
     */
    protected TipoOrigen eOrigen;
    /**
     * Contiene la <code>PlantillaCombo</code> seleccionada en el 
     * <code>Distribuidor</code> Grupal de <code>Componente</code>s.
     */
    protected PlantillaCombo objPlantillaComboDistribucionGrupalSeleccionada;  
    /**
     * Colección de <code>PlantillaCombo</code> Identificadoras de 
     * <code>Distribuidor</code>es ncluidos.
     */
    protected ArrayList<PlantillaCombo> objPlantillasComboDistribucionesGrupales;   
    /**
     * Almacena los <code>Distribuidor</code> Grupales que representan las
     * Distribuciones.
     */    
    protected HashMap<PlantillaCombo, Distribuidor> objDistribucionesGrupales;
    /**
     * Colección de <code>ComponenteGeneradoSimple</code>s.
     */
    protected ArrayList<ComponenteGeneradoSimple> objComponentesGenerados;    
    private String strComponenteSeleccionadoEnTabla;
    /**
     * Contiene el Paquete en el cual será incluido en el proceso de generación
     * de código.
     */    
    protected String strPaquete;    
    private File objFileOutput = null;
    /**
     * Contiene el Componente Beans que representa la abstracción de la GUI que
     * define el Componente actual.
     */    
    protected ComponenteBeans objComponenteBeans;  
    /**
     * Titulo del Formulario.
     */
    protected String strTitulo;    
    /**
     * Menus para el Contenedor
     */
    protected MenuPane objMenu;    
    
    
    /**
     * Constructor utilizado en la Implementación.
     * @param objComponenteBase <code>ComponenteBase</code> que contiene la Información necesaria para crear el Control Swing
     * que representará el <code>Componente</code>.     
     * @param heredado Indica si el <code>Componente</code> es una Instancia independitente o hace parte de una
     * cadena de herencia en la instanciación actual.
     * @param previsualizar Determina si el <code>Componente</code> podrá ser visualizado.
     */
    public ComponenteDistribuidor(ComponenteBaseStandar objComponenteBase, boolean heredado, boolean previsualizar) {
        super(objComponenteBase, true, true);
        this.heredado = heredado;
        this.previsualizar = previsualizar;        
        this.objDistribucionesGrupales = new HashMap<PlantillaCombo, Distribuidor>();
        this.objComponentesGenerados = new ArrayList<ComponenteGeneradoSimple>();
        this.strPaquete = UtilRepresentacion.strPackageRootGUI;
	this.dni = Utileria.leerRecursoTexto("Utileria.dni.componente.distribuidor");   
        if(!heredado) {
            this.idClaseComponenteDistribuidor = (!previsualizar) ?
                    ComponenteDistribuidor.serialIdComponenteDistribuidor++ :
                    ComponenteDistribuidor.serialIdComponenteDistribuidor;
        }        
        strComponenteSeleccionadoEnTabla = "";
        strTitulo = "Sin Título" + String.valueOf(idClaseComponenteDistribuidor);        
    } 
    
    /**
     * Inicializa Referencias en el Componente.
     */
    public void clearAll(){
        this.objDistribucionesGrupales.clear();
        this.objFileOutput = null;
        this.objPlantillaComboDistribucionGrupalSeleccionada = null;
        this.objPlantillasComboDistribucionesGrupales.clear();
    }
    
    /**
     * Devuelve el id de creación del Componente Distribuidor. 
     * @return id de creación del Componente.
     */
    public int getIdClaseComponenteDistribuidor() {
        return idClaseComponenteDistribuidor;
    }    
    
    /**
     * Devuelve la Colección de Plantillas que representan las Plantillas asociadas
     * al Componente. Estas plantillas son una vista abstracta la cual es utilizada
     * en contenedores como <code>JList</code> y <code>JComboBox</code>.
     * @return Colección de Plantillas que representan las Plantillas asociadas
     * al Componente. Estas plantillas son una vista abstracta la cual es utilizada
     * en contenedores como <code>JList</code> y <code>JComboBox</code>.
     */
    public ArrayList<PlantillaCombo> getObjPlantillasComboDistribucionesGrupales() {
        return objPlantillasComboDistribucionesGrupales;
    }        
    
    private void iniciarPlantillaComboDistribucionGrupalSeleccionada(int i){
        if(!this.objPlantillasComboDistribucionesGrupales.isEmpty()){                        
            this.objPlantillaComboDistribucionGrupalSeleccionada = (PlantillaCombo) this.objPlantillasComboDistribucionesGrupales.get(i).clone();
            //this.objPlantillaComboDistribucionGrupalSeleccionada = this.objPlantillasComboDistribucionesGrupales.get(i);
            if(objPlantillaComboDistribucionGrupalSeleccionada.getGeneracion() == PlantillaCombo.GENERACION_PLANTILLA){
                //Esta Comprobación hace necesario inicializar las Distribuciones Individuales
                //de aquellos Componentes que se Representa por Plantillas Predefinidas
                //este caso Aplica para Componentes Unitarios, Enum Simples y Extras
                for(Componente objComponente : this.objComponentesGenerados){
                    objComponente.setObjPlantillaComboDistribucionIndividualSeleccionada((PlantillaCombo) objPlantillaComboDistribucionGrupalSeleccionada.clone());
                }
                if(this instanceof ComponenteDistribuidorGeneradorUnitario){
                    ComponenteDistribuidorGeneradorUnitario objComponenteGeneradorUnitario = (ComponenteDistribuidorGeneradorUnitario) this;
                    objComponenteGeneradorUnitario.getObjComponenteGenerador().setObjPlantillaComboDistribucionIndividualSeleccionada((PlantillaCombo) objPlantillaComboDistribucionGrupalSeleccionada.clone());
                }
                else if(this instanceof ComponenteDistribuidorGeneradorString){
                    ComponenteDistribuidorGeneradorString objComponenteGeneradorString = (ComponenteDistribuidorGeneradorString) this;
                    objComponenteGeneradorString.getObjComponenteGenerador().setObjPlantillaComboDistribucionIndividualSeleccionada((PlantillaCombo) objPlantillaComboDistribucionGrupalSeleccionada.clone());
                }
                else if(this instanceof ComponenteDistribuidorGeneradorEnum){
                    ComponenteDistribuidorGeneradorEnum objComponenteGeneradorEnum = (ComponenteDistribuidorGeneradorEnum) this;
                    objComponenteGeneradorEnum.getObjComponenteGenerador().setObjPlantillaComboDistribucionIndividualSeleccionada((PlantillaCombo) objPlantillaComboDistribucionGrupalSeleccionada.clone());
                }
                else if(this instanceof ComponenteDistribuidorGeneradorVinculador){
                    ComponenteDistribuidorGeneradorVinculador objComponenteGeneradorVinculador = (ComponenteDistribuidorGeneradorVinculador) this;
                    objComponenteGeneradorVinculador.getObjComponenteGenerador().setObjPlantillaComboDistribucionIndividualSeleccionada((PlantillaCombo) objPlantillaComboDistribucionGrupalSeleccionada.clone());
                }
                else if(this instanceof ComponenteDistribuidorGeneradorMetodoSetter){
                    ComponenteDistribuidorGeneradorMetodoSetter objComponenteGeneradorMetodoSetter = (ComponenteDistribuidorGeneradorMetodoSetter) this;
                    objComponenteGeneradorMetodoSetter.getObjComponenteGeneradorParam().setObjPlantillaComboDistribucionIndividualSeleccionada((PlantillaCombo) objPlantillaComboDistribucionGrupalSeleccionada.clone());                    
                }
                else if(this instanceof ComponenteDistribuidorGeneradorMetodoGetter){
                    ComponenteDistribuidorGeneradorMetodoGetter objComponenteGeneradorMetodoGetter = (ComponenteDistribuidorGeneradorMetodoGetter) this;
                    objComponenteGeneradorMetodoGetter.getObjComponenteGeneradorReturn().setObjPlantillaComboDistribucionIndividualSeleccionada((PlantillaCombo) objPlantillaComboDistribucionGrupalSeleccionada.clone());                    
                }
                else if(this instanceof ComponenteDistribuidorGeneradorClaseCompleja){
                    ComponenteDistribuidorGeneradorClaseCompleja objComponenteGeneradorClaseCompleja = (ComponenteDistribuidorGeneradorClaseCompleja) this;
                    for(Componente objComponente : objComponenteGeneradorClaseCompleja.getComponentesDistribuidos()){
                        objComponente.setObjPlantillaComboDistribucionIndividualSeleccionada((PlantillaCombo) objPlantillaComboDistribucionGrupalSeleccionada.clone());
                    }
                }
                else if(this instanceof ComponenteDistribuidorExtra){
                    ComponenteDistribuidorExtra objComponenteExtra = (ComponenteDistribuidorExtra) this;
                    objComponenteExtra.getObjComponenteGenerador().setObjPlantillaComboDistribucionIndividualSeleccionada((PlantillaCombo) objPlantillaComboDistribucionGrupalSeleccionada.clone());
                }
                else if(this instanceof ComponenteDistribuidorIntegradorExtra){
                    ComponenteDistribuidorIntegradorExtra objComponenteIntegradorExtra = (ComponenteDistribuidorIntegradorExtra) this;
                    for(Componente objComponente : objComponenteIntegradorExtra.getObjComponentesDistribuidores()){
                        objComponente.setObjPlantillaComboDistribucionIndividualSeleccionada((PlantillaCombo) objPlantillaComboDistribucionGrupalSeleccionada.clone());
                    }
                }
                else if(this instanceof ComponenteDistribuidorIntegradorSimple){
                    ComponenteDistribuidorIntegradorSimple objComponenteIntegradorSimple = (ComponenteDistribuidorIntegradorSimple) this;
                    for(Componente objComponente : objComponenteIntegradorSimple.getComponentesDistribuidos()){
                        objComponente.setObjPlantillaComboDistribucionIndividualSeleccionada((PlantillaCombo) objPlantillaComboDistribucionGrupalSeleccionada.clone());
                    }
                }
                else if(this instanceof ComponenteDistribuidorIntegradorMetodo){
                    ComponenteDistribuidorIntegradorMetodo objComponenteIntegradorMetodo = (ComponenteDistribuidorIntegradorMetodo) this;
                    for(Componente objComponente : objComponenteIntegradorMetodo.getComponentesDistribuidos()){
                        objComponente.setObjPlantillaComboDistribucionIndividualSeleccionada((PlantillaCombo) objPlantillaComboDistribucionGrupalSeleccionada.clone());
                    }
                }
            }
            else if(objPlantillaComboDistribucionGrupalSeleccionada.getGeneracion() == PlantillaCombo.GENERACION_AUTOMATICA){
                //Esta Comprobación indica que el Componente Distribuidor
                //No tiene Plantillas Predefinidas por lo cual utiliza la 
                //Generación Automatica esto indica que los Componentes Incluidos deben Inicializar
                //Su PlantillaIndividual
                if(this instanceof ComponenteDistribuidorContenedorEspejo){
                    ComponenteDistribuidorContenedorEspejo objComponenteContenedorAsistenteEspejo = (ComponenteDistribuidorContenedorEspejo) this;
                    for(Componente objComponente : objComponenteContenedorAsistenteEspejo.getObjComponentes()){
                        objComponente.setObjPlantillaComboDistribucionIndividualSeleccionada((PlantillaCombo) objPlantillaComboDistribucionGrupalSeleccionada.clone());
                    }
                }
                else if(this instanceof ComponenteDistribuidorContenedorLibre){
                    ComponenteDistribuidorContenedorLibre objComponenteContenedorAsistenteLibre = (ComponenteDistribuidorContenedorLibre) this;
                    for(Componente objComponente : objComponenteContenedorAsistenteLibre.getObjComponentes()){
                        objComponente.setObjPlantillaComboDistribucionIndividualSeleccionada((PlantillaCombo) objPlantillaComboDistribucionGrupalSeleccionada.clone());
                    }
                }
                else if(this instanceof ComponenteDistribuidorIntegradorExtra){
                    ComponenteDistribuidorIntegradorExtra objComponenteIntegradorExtra = (ComponenteDistribuidorIntegradorExtra) this;
                    for(Componente objComponente : objComponenteIntegradorExtra.getObjComponentesDistribuidores()){
                        objComponente.setObjPlantillaComboDistribucionIndividualSeleccionada((PlantillaCombo) objPlantillaComboDistribucionGrupalSeleccionada.clone());
                    }
                }
                else if(this instanceof ComponenteDistribuidorIntegradorMetodo){
                    ComponenteDistribuidorIntegradorMetodo objComponenteIntegradorMetodo = (ComponenteDistribuidorIntegradorMetodo) this;
                    for(Componente objComponente : objComponenteIntegradorMetodo.getComponentesDistribuidos()){
                        objComponente.setObjPlantillaComboDistribucionIndividualSeleccionada((PlantillaCombo) objPlantillaComboDistribucionGrupalSeleccionada.clone());
                    }
                }
                else if(this instanceof ComponenteDistribuidorIntegradorSimple){
                    ComponenteDistribuidorIntegradorSimple objComponenteIntegradorSimple = (ComponenteDistribuidorIntegradorSimple) this;
                    for(Componente objComponente : objComponenteIntegradorSimple.getComponentesDistribuidos()){
                        objComponente.setObjPlantillaComboDistribucionIndividualSeleccionada((PlantillaCombo) objPlantillaComboDistribucionGrupalSeleccionada.clone());
                    }
                }
                else if(this instanceof ComponenteDistribuidorGeneradorClaseCompleja){
                    ComponenteDistribuidorGeneradorClaseCompleja objComponenteGeneradorClaseCompleja = (ComponenteDistribuidorGeneradorClaseCompleja) this;
                    for(Componente objComponente : objComponenteGeneradorClaseCompleja.getComponentesDistribuidos()){
                        objComponente.setObjPlantillaComboDistribucionIndividualSeleccionada((PlantillaCombo) objPlantillaComboDistribucionGrupalSeleccionada.clone());
                    }
                }
                else if(this instanceof ComponenteDistribuidorGeneradorMetodoSetter){
                    ComponenteDistribuidorGeneradorMetodoSetter objComponenteGeneradorMetodoSetter = (ComponenteDistribuidorGeneradorMetodoSetter) this;
                    objComponenteGeneradorMetodoSetter.getObjComponenteGeneradorParam().setObjPlantillaComboDistribucionIndividualSeleccionada((PlantillaCombo) objPlantillaComboDistribucionGrupalSeleccionada.clone());                    
                }
                else if(this instanceof ComponenteDistribuidorGeneradorMetodoGetter){
                    ComponenteDistribuidorGeneradorMetodoGetter objComponenteGeneradorMetodoGetter = (ComponenteDistribuidorGeneradorMetodoGetter) this;
                    objComponenteGeneradorMetodoGetter.getObjComponenteGeneradorReturn().setObjPlantillaComboDistribucionIndividualSeleccionada((PlantillaCombo) objPlantillaComboDistribucionGrupalSeleccionada.clone());                    
                }
                else if(this instanceof ComponenteDistribuidorGeneradorUnitario){
                    ComponenteDistribuidorGeneradorUnitario objComponenteGeneradorUnitario = (ComponenteDistribuidorGeneradorUnitario) this;
                    objComponenteGeneradorUnitario.getObjComponenteGenerador().setObjPlantillaComboDistribucionIndividualSeleccionada((PlantillaCombo) objPlantillaComboDistribucionGrupalSeleccionada.clone());
                }
                else if(this instanceof ComponenteDistribuidorGeneradorString){
                    ComponenteDistribuidorGeneradorString objComponenteGeneradorString = (ComponenteDistribuidorGeneradorString) this;
                    objComponenteGeneradorString.getObjComponenteGenerador().setObjPlantillaComboDistribucionIndividualSeleccionada((PlantillaCombo) objPlantillaComboDistribucionGrupalSeleccionada.clone());
                }
                else if(this instanceof ComponenteDistribuidorGeneradorEnum){
                    ComponenteDistribuidorGeneradorEnum objComponenteGeneradorEnum = (ComponenteDistribuidorGeneradorEnum) this;
                    objComponenteGeneradorEnum.getObjComponenteGenerador().setObjPlantillaComboDistribucionIndividualSeleccionada((PlantillaCombo) objPlantillaComboDistribucionGrupalSeleccionada.clone());
                }
                else if(this instanceof ComponenteDistribuidorGeneradorVinculador){
                    ComponenteDistribuidorGeneradorVinculador objComponenteGeneradorVinculador = (ComponenteDistribuidorGeneradorVinculador) this;
                    objComponenteGeneradorVinculador.getObjComponenteGenerador().setObjPlantillaComboDistribucionIndividualSeleccionada((PlantillaCombo) objPlantillaComboDistribucionGrupalSeleccionada.clone());
                }
            }
        }
    }

    @Override
    protected void actualizarGridBagConstraintsActiva() {
        try{
            int gridwidth = 0;
            int gridheight = 0;
            ArrayList<Componente> objComponentes = this.getObjDistribuidorGrupalSeleccionado().objComponentesDistribuidos;
            for(Componente objComponente : objComponentes){
                GridBagConstraints objConstraints = objComponente.getGridBagConstraintsActiva();
                gridwidth += objConstraints.gridwidth;
                gridheight += objConstraints.gridheight;
            }
            this.getGridBagConstraintsActiva().gridwidth = gridwidth;
            this.getGridBagConstraintsActiva().gridheight = gridheight;            
        }catch(java.lang.NullPointerException ex){            
            Logger.getLogger(Distribuidor.class.getName()).log(Level.SEVERE, null, ex);
        }        
    }
    
    /**
     * <p>Devuelve una Colección de <code>PlantillaCombo</code> que representarán 
     * las Distribuciónes genericás generadas por la Aplicación iniciando desde
     * un indice personalizado.</p>
     * @param i Id inicial para la Colección.
     * @return <p>Colección de <code>PlantillaCombo</code> que representarán 
     * las Distribuciónes genericás generadas por la Aplicación iniciando desde
     * un indice personalizado.</p>  
     */    
    public ArrayList<PlantillaCombo> getObjPlantillasComboPorDefecto(int i){
        ArrayList<PlantillaCombo> objPlantillasCombo = new ArrayList<PlantillaCombo>();        
        int j = 0;
        while(!UtilAsistente.leerRecursoTexto("Plantilla.combo[" + j + "]").equals("")){
            PlantillaCombo objPlantillaCombo = new PlantillaCombo();
            objPlantillaCombo.setId(i);
            objPlantillaCombo.setStrId(String.valueOf(i));
            objPlantillaCombo.setStrTitulo(UtilAsistente.leerRecursoTexto("Plantilla.combo[" + j + "]"));
            objPlantillaCombo.setGlobal(true);
            objPlantillaCombo.setManual(false);
            objPlantillaCombo.setGeneracion(PlantillaCombo.GENERACION_AUTOMATICA);
            objPlantillasCombo.add(objPlantillaCombo);
            i++;
            switch(j){                
                case 0://Vertical
                    this.crearDistribuicionGrupalInicial(objPlantillaCombo, this.getDistribucionGrupalInicialVertical(objPlantillaCombo));    
                    break;
                case 1://Horizontal
                    this.crearDistribuicionGrupalInicial(objPlantillaCombo, this.getDistribucionGrupalInicialHorizontal(objPlantillaCombo));                    
                    break;
                case 2://Rectangular
                    this.crearDistribuicionGrupalInicial(objPlantillaCombo, this.getDistribucionGrupalInicialRectangular(objPlantillaCombo));    
                    break;
            }     
            j++;
        }
        PlantillaCombo objPlantillaCombo = new PlantillaCombo();
        objPlantillaCombo.setId(i);
        objPlantillaCombo.setStrId(String.valueOf(i));
        objPlantillaCombo.setStrTitulo("Plantilla Manual");
        objPlantillaCombo.setGlobal(true);
        objPlantillaCombo.setManual(true);
        objPlantillaCombo.setGeneracion(PlantillaCombo.GENERACION_MANUAL);
        objPlantillasCombo.add(objPlantillaCombo);
        this.crearDistribuicionGrupalInicial(objPlantillaCombo, this.getDistribucionGrupalInicialVertical(objPlantillaCombo));
        return objPlantillasCombo;
    }    
    
    /**
     * Establece la Colección de Plantillas que distribuyen el Componente y
     * sus componentes incluidos (<code>ComponenteGeneradoSimple</code>).
     * @param objPlantillas  Colección de Plantillas que distribuyen el Componente y
     * sus componentes incluidos (<code>ComponenteGeneradoSimple</code>).
     */
    public void cargarPlantillasDesdeArchivoProperties(ArrayList<Plantilla> objPlantillas) {
        this.objPlantillasComboDistribucionesGrupales = new ArrayList<PlantillaCombo>();
        if(objPlantillas != null){            
            for(Plantilla objTempPlantilla : objPlantillas){
                PlantillaCombo objTempPlantillaCombo = new PlantillaCombo();
                objTempPlantillaCombo.setGlobal(false);
                objTempPlantillaCombo.setManual(false);
                objTempPlantillaCombo.setId(objTempPlantilla.getId());
                objTempPlantillaCombo.setStrId(String.valueOf(objTempPlantilla.getId()));
                objTempPlantillaCombo.setStrTitulo(objTempPlantilla.getStrTitulo());
                objTempPlantillaCombo.setGeneracion(PlantillaCombo.GENERACION_PLANTILLA);
                this.objPlantillasComboDistribucionesGrupales.add(objTempPlantillaCombo);
                this.crearDistribuicionGrupalInicial(objTempPlantillaCombo, objTempPlantilla.getObjPlantillasComponentes());
            }
            this.objPlantillasComboDistribucionesGrupales.addAll(this.getObjPlantillasComboPorDefecto(objPlantillas.size()));        
        }
        else{
            this.objPlantillasComboDistribucionesGrupales.addAll(this.getObjPlantillasComboPorDefecto(0));        
        }        
//        if(this instanceof ComponenteDistribuidorGeneradorVinculadorTipoDato){
//            this.iniciarPlantillaComboDistribucionGrupalSeleccionada(1);
//        }            
//        else{
//            this.iniciarPlantillaComboDistribucionGrupalSeleccionada(0);
//        }
        this.iniciarPlantillaComboDistribucionGrupalSeleccionada(0);
    }         

    /**
     * Devuelve una matriz que representa una vista del <code>ComponenteDistribuidor</code> 
     * y sus <code>ComponenteGeneradoSimple</code> incluidos la cual sirve para crear un modelo 
     * y asociarlo a un <code>JTable</code>.
     * @return matriz que representa una vista del <code>ComponenteDistribuidor</code> 
     * y sus <code>ComponenteGeneradoSimple</code> incluidos la cual sirve para crear un modelo 
     * y asociarlo a un <code>JTable</code>.
     */
    public Object[][] getObjDataTablaDistribucion() {
        Distribuidor objTempDistribuidor = this.getObjDistribuidorGrupalSeleccionado();
        return objTempDistribuidor.getObjDataTablaDistribucion();
    }

    /**
     * Establece una matriz que representa una vista del <code>ComponenteDistribuidor</code> 
     * y sus <code>ComponenteGeneradoSimple</code> incluidos la cual sirve para crear un modelo 
     * y asociarlo a un <code>JTable</code>.
     * @param objDataTablaDistribucion @DefinicionParametro
     */
    public void setObjDataTablaDistribucion(Object[][] objDataTablaDistribucion) {
        Distribuidor objTempDistribuidor = this.getObjDistribuidorGrupalSeleccionado();
        objTempDistribuidor.setObjDataTablaDistribucion(objDataTablaDistribucion);
    }
    
    public MyTableModelDistribucionComponentes getObjModeloTablaDistribucion() {
        Distribuidor objTempDistribuidor = this.getObjDistribuidorGrupalSeleccionado();
        MyTableModelDistribucionComponentes objMyModel = 
                new MyTableModelDistribucionComponentes(
                        objTempDistribuidor.getObjTituloTablaDistribucion(), 
                        objTempDistribuidor.getObjDataTablaDistribucion());
        return objMyModel;
    }

    public void setObjModeloTablaDistribucion(Object[][] objDataTablaDistribucion) {
        this.setObjDataTablaDistribucion(objDataTablaDistribucion);
    }       

    /**
     * Devuelve el Modo que Determina el Origen del Componente, es decir el modo por el cual fue 
     * creado. Los Modos pueden ser (Base - Personalizado).     
     * @return Modo que Determina el Origen del Componente, es decir el modo por el cual fue 
     * creado. Los Modos pueden ser (Base - Personalizado).     
     */
    public TipoOrigen geteOrigen() {
        return eOrigen;
    }

    /**
     * Establece el Modo que Determina el Origen del Componente, es decir el modo por el cual fue 
     * creado. Los Modos pueden ser (Base - Personalizado).     
     * @param eOrigen Modo que Determina el Origen del Componente, es decir el modo por el cual fue 
     * creado. Los Modos pueden ser (Base - Personalizado).     
     */
    public void seteOrigen(TipoOrigen eOrigen) {
        this.eOrigen = eOrigen;
    }
    
    /**
     * Devuelve el Componente dentro de la Colección que representa el Nombre
     * de la Propiedad.
     * @param strName Nombre de la Propiedad que identifica el <code>Componente</code>     
     * @return Componente de la Colección que Identifica al <code>Componente</code>.
     */
    public abstract Componente getObjComponenteIncluido(String strName);   
    
    @Override
    public void ok() {
        if(this.previsualizar){
            this.idClaseComponenteDistribuidor = ComponenteDistribuidor.serialIdComponenteDistribuidor++;
            this.previsualizar = false;
        }
    } 
    @Override 
    public int compareTo(Object o) {
        ComponenteDistribuidor obj = (ComponenteDistribuidor) o;
        if(this.idClaseComponenteDistribuidor > obj.idClaseComponenteDistribuidor) {
            return 1;
        }
        else if(this.idClaseComponenteDistribuidor < obj.idClaseComponenteDistribuidor) {
            return -1;
        }
        else {
            return 0;
        }
    }   
    
    /**
     * Devuelve la Colección de <code>Componente</code>s Incluidos en la Distribución Actual.
     * @return Colección de <code>Componente</code>s Incluidos en la Distribución Actual.
     */
    public ArrayList<Componente> getComponentesDistribuidos() {
        Distribuidor objTempDistribuidor = this.getObjDistribuidorGrupalSeleccionado();
        return objTempDistribuidor.getObjComponentesDistribuidos();
    }
    
    /**
     * Determina si el Componente existe en la Colección de Componentes Distribuidos.
     * @param objComponente Referencia que se buscará.
     * @return boolean que determina si el Componente existe en la Colección de Componentes Distribuidos.
     */
    public boolean existeComponenteEnDistribucionActual(Componente objComponente){
        for(Componente obj : getComponentesDistribuidos()){
            if(obj.getName().equals(objComponente.getName()))return true;
        }
        return false;
    }
    
    /**
     * Agrega un <code>Componente</code> a la Colección de Componentes incluidos
     * que representan la distribución actual siempre y cuando no haya sido incluido
     * previamente.
     * @param objComponenteIncluido <code>Componente</code>.
     * @return Estado que determina si el <code>Componente</code> ha sido agregado 
     * a la Colección de Componentes incluidos que representan la distribución actual.
     */
    public boolean agregarComponenteDistribuido(Componente objComponenteIncluido){
        try{
            Distribuidor objTempDistribuidor = this.getObjDistribuidorGrupalSeleccionado();
            return objTempDistribuidor.agregarComponente(objComponenteIncluido);
        }catch(java.lang.NullPointerException ex){
            Logger.getLogger(ComponenteDistribuidor.class.getName()).log(Level.SEVERE, null, ex);            
        }
        return false;        
    }
    
    /**
     * Busca un <code>Componente</code> Incluido en el <code>Componente</code> Actual.
     * Este Proceso varia deacuerdo al Tipo de <code>Componente</code> por lo tanto
     * se delega el respectivo proceso en cada una de las Subclases <code>Componente</code>.
     * @param strName Nombre del <code>Componente</code>.
     * @return <code>Componente</code> que corresponde al Nombre recibido o <code>null</code>
     * en caso de no estar presente en las Colecciones del <code>Componente</code>.
     * @see #getObjComponenteGeneradorIntoCasoArray(java.lang.String) 
     */
    public abstract Componente buscarComponente(String strName);
    
    /**
     * Elimina un <code>Componente</code> a la Colección de Componentes incluidos
     * que representan la distribución actual.
     * @param objComponenteIncluido <code>Componente</code>.
     * @return Estado que determina si el <code>Componente</code> ha sido agregado 
     * a la Colección de Componentes incluidos que representan la distribución actual.
     */
    public boolean eliminarComponenteDistribuido(Componente objComponenteIncluido){
        try{
            Distribuidor objTempDistribuidor = this.getObjDistribuidorGrupalSeleccionado();
            return objTempDistribuidor.eliminarComponente(objComponenteIncluido);
        }catch(java.lang.NullPointerException ex){
            Logger.getLogger(ComponenteDistribuidor.class.getName()).log(Level.SEVERE, null, ex);            
        }
        return false;        
    }  
    
    /**
     * Elimina un <code>Componente</code> de la Colección de Componentes incluidos
     * por medio del nombre recibido como parametro.
     * @param strName Nombre del <code>Componente</code> que se eliminará de la Distribución Actual.
     * @return boolean que determina si el <code>Componente</code> ha sido eliminado de la
     * Distribución Actual.
     */
    public boolean eliminarComponenteDistribuido(String strName){
        return this.eliminarComponenteDistribuido(this.getObjComponenteIncluido(strName));
    }
    
    /**
     * Elimina un <code>Componente</code> Independiente 
     * por medio del nombre recibido como parametro.
     * @param objComponente 
     * @return boolean que determina si el <code>Componente</code> ha sido eliminado.
     */
    public boolean eliminarComponenteGeneradoIndependiente(ComponenteGeneradoSimple objComponente){
        if(objComponente.isIndependiente()){
            for(Distribuidor objTempDistribuidor : objDistribucionesGrupales.values()){
                if(objTempDistribuidor.buscarComponenteIncluidoEnDistribucion(objComponente.getName()) != null){
                    objTempDistribuidor.eliminarComponente(objComponente);
                }
            }
            return objComponentesGenerados.remove(objComponente);
        }
        return false;
    }
    
    /**
     * Devuelve el <code>Componente</code> Incluido en la Distribución Actual
     * que corresponde al Nombre recibido en el Parametro.
     * @param strName Nombre del <code>Componente</code> que se buscará en la Distribución Actual.
     * @return boolean que determina si el <code>Componente</code> se encuentra en la
     * Distribución Actual.
     */
    public Componente buscarComponenteEnDistribucion(String strName) {        
        Distribuidor objTempDistribuidor = this.getObjDistribuidorGrupalSeleccionado();
        return objTempDistribuidor.buscarComponenteIncluidoEnDistribucion(strName);
    }
    
    /**
     * Devuelve el <code>Distribuidor</code> Seleccionado que representa
     * la distribución actual.
     * @return <code>Distribuidor</code> Seleccionado que representa
     * la distribución actual.
     * @see com.ufps.cuatro.modelo.representacion.Distribuidor
     */
    public Distribuidor getObjDistribuidorGrupalSeleccionado(){
        return this.objDistribucionesGrupales.get(this.objPlantillaComboDistribucionGrupalSeleccionada);
    }
    
    /**
     * Devuelve la Colección de <code>ComponenteGeneradoSimple</code> agregados como
     * Complementos en la Representación de <code>ComponenteDistribuidor</code>.
     * @return Colección de <code>ComponenteGeneradoSimple</code> agregados como
     * Complementos en la Representación de <code>ComponenteDistribuidor</code>.
     */
    public ArrayList<ComponenteGeneradoSimple> getObjComponentesGenerados() {
        return objComponentesGenerados;
    }

    /**
     * Establece la Colección de <code>ComponenteGeneradoSimple</code> agregados como
     * Complementos en la Representación de <code>ComponenteDistribuidor</code>.
     * @param objComponentesGenerados Colección de <code>ComponenteGeneradoSimple</code> agregados como
     * Complementos en la Representación de <code>ComponenteDistribuidor</code>.
     */
    public void setObjComponentesGenerados(ArrayList<ComponenteGeneradoSimple> objComponentesGenerados) {
        this.objComponentesGenerados = objComponentesGenerados;
    }
    
    /**
     * Agrega un <code>ComponenteGeneradoSimple</code> a la Colección de <code>ComponenteGeneradoSimple</code> agregados como
     * Complementos en la Representación de <code>ComponenteDistribuidor</code>.
     * @param obj <code>ComponenteGeneradoSimple</code> que se agregará a la 
     * Colección de <code>ComponenteGeneradoSimple</code> agregados como
     * Complementos en la Representación de <code>ComponenteDistribuidor</code>.
     */
    public void addComponenteGenerado(ComponenteGeneradoSimple obj){
        obj.idColeccion = this.getObjComponentesGenerados().size();
        this.getObjComponentesGenerados().add(obj);
    }
    
    /**
     * Sincroniza el id en la Biblioteca en la cual será incluido.
     * @param id id en la Biblioteca en la cual será incluido.
     */
    public abstract void importId(int id);
    
    /**
     * Devuelve el <code>ComponenteGeneradoSimple</code> Incluido en la Colección de 
     * <code>ComponenteGeneradoSimple</code> agregados como Complementos en la 
     * Representación de <code>ComponenteDistribuidor</code> que corresponde al 
     * Nombre recibido en el Parametro.
     * @param strName Nombre del <code>Componente</code> que se buscará en la Distribución Actual.
     * @return boolean que determina si el <code>Componente</code> se encuentra en la
     * Distribución Actual.
     */
    public ComponenteGeneradoSimple buscarComponenteGenerado(String strName){
        try{          
            for(ComponenteGeneradoSimple objComponenteGenerado : this.objComponentesGenerados){
                if(objComponenteGenerado.getName().equals(strName)){
                    return objComponenteGenerado;
                }
            }            
        }catch(java.lang.NullPointerException ex){            
            Logger.getLogger(ComponenteDistribuidor.class.getName()).log(Level.SEVERE, null, ex);            
        }
        return null;
    }   
    
    /**
     * Devuelve el <code>HashMap</code> que Contiene las distribución Soportadas
     * por el <code>ComponenteDistribuidor</code>.
     * @return <code>HashMap</code> que Contiene las distribución Soportadas
     * por el <code>ComponenteDistribuidor</code>.
     */
    public HashMap<PlantillaCombo, Distribuidor> getObjDistribucionesGrupales() {
        return objDistribucionesGrupales;
    }

    /**
     * Establece el <code>HashMap</code> que Contiene las distribución Soportadas
     * por el <code>ComponenteDistribuidor</code>.
     * @param objDistribucionesGrupales <code>HashMap</code> que Contiene las distribución Soportadas
     * por el <code>ComponenteDistribuidor</code>.
     */
    public void setObjDistribucionesGrupales(HashMap<PlantillaCombo, Distribuidor> objDistribucionesGrupales) {
        this.objDistribucionesGrupales = objDistribucionesGrupales;
    }

    /**
     * Devuelve la <code>PlantillaCombo</code> que representa la Distribución Grupal 
     * Actual Seleccionada.
     * @return <code>PlantillaCombo</code> que representa la Distribución Grupal 
     * Actual Seleccionada.
     */
    public PlantillaCombo getObjPlantillaComboDistribucionGrupalSeleccionada() {
        return objPlantillaComboDistribucionGrupalSeleccionada;
    }

    /**
     * Establece la <code>PlantillaCombo</code> que representa la Distribución Grupal 
     * Actual Seleccionada.
     * @param objPlantillaComboDistribucionGrupalSeleccionada <code>PlantillaCombo</code> que representa la Distribución Grupal 
     * Actual Seleccionada.
     */
    public void setObjPlantillaComboDistribucionGrupalSeleccionada(PlantillaCombo objPlantillaComboDistribucionGrupalSeleccionada) {
        this.objPlantillaComboDistribucionGrupalSeleccionada = objPlantillaComboDistribucionGrupalSeleccionada;
    }
    
    /**
     * Agrega ó Actualiza un <code>Distribuidor</code> en el Mapa de Distribuidores del <code>ComponenteDistribuidor</code> por medio
     * de una <code>PlantillaCombo</code> que representa la Distribución.
     * @param objPlantillaComboDistribucionGrupal <code>PlantillaCombo</code> que representa la Distribución.
     * @param objDistribuidor <code>Distribuidor</code> que se Agregará ó Actualizará en el Mapa de Distribuidores del <code>ComponenteDistribuidor</code>.
     * @return boolean que determina el resultado del proceso.
     * @see #actualizarDistribucionGrupal(cuatro.modelo.representacion.PlantillaCombo, com.ufps.cuatro.modelo.representacion.Distribuidor) 
     */
    public boolean agregarDistribucionGrupal(PlantillaCombo objPlantillaComboDistribucionGrupal, Distribuidor objDistribuidor){
        this.objDistribucionesGrupales.put(objPlantillaComboDistribucionGrupal, objDistribuidor);
        return true;
    }
    
    /**
     * Agrega ó Actualiza un <code>Distribuidor</code> en el Mapa de Distribuidores del <code>ComponenteDistribuidor</code> por medio
     * de una <code>PlantillaCombo</code> que representa la Distribución.
     * Este método es exactamente igual a #agregarDistribucionGrupal(cuatro.modelo.representacion.PlantillaCombo, com.ufps.cuatro.modelo.representacion.Distribuidor) 
     * su existencia es requerida por conveniencia en la identificación de procesos internos.
     * @param objPlantillaComboDistribucionGrupal <code>PlantillaCombo</code> que representa la Distribución.
     * @param objDistribuidor <code>Distribuidor</code> que se Agregará ó Actualizará en el Mapa de Distribuidores del <code>ComponenteDistribuidor</code>.
     * @return boolean que determina el resultado del proceso.
     * @see #agregarDistribucionGrupal(cuatro.modelo.representacion.PlantillaCombo, com.ufps.cuatro.modelo.representacion.Distribuidor) 
     */
    public boolean actualizarDistribucionGrupal(PlantillaCombo objPlantillaComboDistribucionGrupal, Distribuidor objDistribuidor){
        this.objDistribucionesGrupales.put(objPlantillaComboDistribucionGrupal, objDistribuidor);
        return true;
    }
    
    /**
     * Determina si se han Agregado Distribuciones Grupales al <code>ComponenteDistribuidor</code>.
     * @return boolean que determna si existen Distribuciones Grupales Agregadas.
     */
    public boolean existenDistribucionesGrupales(){
        return !this.objDistribucionesGrupales.isEmpty();        
    }
    
    /**
     * Devuelve un <code>Distribuidor</code> por medio de una <code>PlantillaCombo</code>.
     * @param objPlantillaComboDistribucionGrupal <code>PlantillaCombo</code> que representa la Distribución que se Devolverá.
     * @return <code>Distribuidor</code> que representa la Distribución Grupal que se Devolverá.
     */
    public Distribuidor devolverDistribuciónGrupal(PlantillaCombo objPlantillaComboDistribucionGrupal){
        return this.objDistribucionesGrupales.get(objPlantillaComboDistribucionGrupal);
    }
    
    /**
     * Elimina y Devuelve un <code>Distribuidor</code> por medio de una <code>PlantillaCombo</code>.
     * @param objPlantillaComboDistribucionGrupal <code>PlantillaCombo</code> que representa la Distribución que se Eliminará.
     * @return <code>Distribuidor</code> que representa la Distribución Grupal que se Eliminará.
     */
    public Distribuidor eliminarDistribucionGrupal(PlantillaCombo objPlantillaComboDistribucionGrupal){
        return this.objDistribucionesGrupales.remove(objPlantillaComboDistribucionGrupal);        
    }
    
    /**
     * Determina si existeArchivo en las Distribuciones Grupales un <code>Distribuidor</code> que corresponda
     * a la <code>PlantillaCombo</code> que representa la Distribución.
     * @param objPlantillaComboDistribucionGrupal <code>PlantillaCombo</code> que representa la Distribución que se Buscará.
     * @return boolean que determina si existeArchivo un <code>Distribuidor</code> que corresponda
     * a la <code>PlantillaCombo</code> que representa la Distribución.
     */
    public boolean existeDistribucionGrupal(PlantillaCombo objPlantillaComboDistribucionGrupal){
        return this.objDistribucionesGrupales.containsKey(objPlantillaComboDistribucionGrupal);
    }
    
    /**
     * Determina si existeArchivo un <code>Distribuidor</code> que corresponda a la 
     * <code>PlantillaCombo</code> Global Seleccionada.
     * @return boolean que determina si existeArchivo un <code>Distribuidor</code> que corresponda
     * a la <code>PlantillaCombo</code> Global Seleccionada.
     */
    public boolean existeDistribucionGrupalSeleccionada(){
        return this.existeDistribucionGrupal(this.objPlantillaComboDistribucionGrupalSeleccionada);
    }

    /**
     * Devuelve el Nombre del <code>Componente</code> Seleccionado en la Tabla de Distribución.
     * Este es un Método utilitario que se utiliza como soporte para operaciones de Distribuciones.
     * @return Nombre del <code>Componente</code> Seleccionado en la Tabla de Distribución.
     */
    public String getStrComponenteSeleccionadoEnTabla() {
        return strComponenteSeleccionadoEnTabla;
    }

    /**
     * Establece el Nombre del <code>Componente</code> Seleccionado en la Tabla de Distribución.
     * Este es un Método utilitario que se utiliza como soporte para operaciones de Distribuciones.
     * @param strComponenteSeleccionadoEnTabla Nombre del <code>Componente</code> Seleccionado en la Tabla de Distribución.
     */
    public void setStrComponenteSeleccionadoEnTabla(String strComponenteSeleccionadoEnTabla) {
        this.strComponenteSeleccionadoEnTabla = strComponenteSeleccionadoEnTabla;
    }    
    
    /**
     * Actualiza los <code>gridx</code>, <code>gridy</code> del <code>GridBagConstraints</code> Activo 
     * del <code>Componente</code> recibido en el Parametro por medio del <code>GridBagConstraints</code>
     * que representará la Distribución donde se Representará el <code>Componente</code>.
     * @param objGridBagConstraintsParent <code>GridBagConstraints</code> que representará la 
     * Distribución donde se Representará el <code>Componente</code>.
     * @param objComponente <code>Componente</code> recibido en el Parametro.
     * @return <code>GridBagConstraints</code> Actualizado en sus <code>gridx</code>, <code>gridy</code>.
     */
    public GridBagConstraints getGridBagConstraintsIntoParent(GridBagConstraints objGridBagConstraintsParent, Componente objComponente){
        try{
            GridBagConstraints objGridBagConstraintsParentComponente = this.getGridBagConstraintsActiva();
            GridBagConstraints objGridBagConstraintsComponente = objComponente.getGridBagConstraintsActiva();
            GridBagConstraints objGridBagConstraintsAll = (GridBagConstraints) objGridBagConstraintsComponente.clone();
            objGridBagConstraintsAll.gridx = objGridBagConstraintsParent.gridx + objGridBagConstraintsParentComponente.gridx + objGridBagConstraintsComponente.gridx;
            objGridBagConstraintsAll.gridy = objGridBagConstraintsParent.gridy + objGridBagConstraintsParentComponente.gridy + objGridBagConstraintsComponente.gridy;
            //Nuevo Experimental para mantener las coordenas de ultima distribución configurada.
            //objGridBagConstraintsComponente.gridx = objGridBagConstraintsAll.gridx;
            //objGridBagConstraintsComponente.gridy = objGridBagConstraintsAll.gridy;
            objComponente.setObjGridBagConstraintsGUI(objGridBagConstraintsAll);
            return objGridBagConstraintsAll;
        }catch(java.lang.NullPointerException ex){   
            Utileria.viewConsole("Componente Parent: " + this.getName() + " - Componente Incluido: " + objComponente.getName());
            Logger.getLogger(ComponenteDistribuidor.class.getName()).log(Level.SEVERE, null, ex);            
        }
        return null;
    }    

    /**
     * Devuelve el Paquete Asignado al <code>ComponenteDistribuidor</code>.
     * @return Paquete Asignado al <code>ComponenteDistribuidor</code>.
     */
    public String getStrPaquete() {
        return strPaquete;
    }

    /**
     * Establece el Paquete Asignado al <code>ComponenteDistribuidor</code>.
     * @param strPaquete Paquete Asignado al <code>ComponenteDistribuidor</code>.
     */
    public void setStrPaquete(String strPaquete) {
        this.strPaquete = strPaquete;
        updateDefinitionPackage(strPaquete);        
    }
    
    protected void updateDefinitionPackage(String strPaquete){
        for(Componente objComponente : getComponentesDistribuidos()){
//            if(objComponente instanceof ComponenteDistribuidor){
//                ComponenteDistribuidor objComponenteDistribuidor = (ComponenteDistribuidor) objComponente;
//                objComponenteDistribuidor.updateDefinitionPackage(strPaquete);
//            }
//            else 
            if(objComponente instanceof ComponenteGenerado){
                ComponenteGenerado objComponenteGenerado = (ComponenteGenerado) objComponente;
                objComponenteGenerado.addSwap("package", strPaquete);
            }
        }        
    }
    
    /**
     * Devuelve el Paquete Asignado al <code>ComponenteDistribuidor</code> en Formato Archivo.
     * @return Paquete Asignado al <code>ComponenteDistribuidor</code> en Formato Archivo.
     */
    public String getStrPaqueteToFile() {
        String strFilePaquete = new String(strPaquete.toCharArray());        
        return getStrPaqueteToFile(strFilePaquete);
    }    
    
    /**
     * Devuelve el Archivo de Salida del Código Fuente.
     * @return Archivo de Salida del Código Fuente.
     */
    public File getObjFileOutput() {
        return objFileOutput;
    }

    /**
     * Establece el Archivo de Salida del Código Fuente.
     * @param objFileOutput Archivo de Salida del Código Fuente.
     */
    public void setObjFileOutput(File objFileOutput) {
        this.objFileOutput = objFileOutput;
    }

    /**
     * Devuelve el Componente Beans que representa el Componente Actual.
     * @return Componente Beans que representa el Componente Actual.
     * @deprecated Se ha implementado una representación por Tipos de datos.
     */
    public ComponenteBeans getObjComponenteBeans() {
        if(objComponenteBeans == null){
            objComponenteBeans = generarRepresentacionBeans();
        }
        return objComponenteBeans;
    }
    
    /**
     * Devuelve el Titulo del Formulario.
     * @return Titulo del Formulario.
     */
    public String getStrTitulo() {
        return strTitulo;
    }

    /**
     * Establece el Titulo del Formulario.
     * @param strTitulo Titulo del Formulario.
     */
    public void setStrTitulo(String strTitulo) {
        this.strTitulo = strTitulo;
    }    
    
    @Override
    protected Object clone() {
        ComponenteDistribuidor objClon;
        //----------------------------------------------------------
        //Primero se Clona la Referencia Local
        //----------------------------------------------------------
        objClon = (ComponenteDistribuidor) super.clone();
        //----------------------------------------------------------
        //Ahora se hace la Clonación Profunda
        //----------------------------------------------------------
        if(this.eOrigen != null){
            ((ComponenteDistribuidor)objClon).eOrigen = eOrigen;
        }
        if(this.objComponentesGenerados != null){
            ((ComponenteDistribuidor)objClon).objComponentesGenerados = (ArrayList<ComponenteGeneradoSimple>) objComponentesGenerados.clone();
        }
        if(this.objDistribucionesGrupales != null){
            ((ComponenteDistribuidor)objClon).objDistribucionesGrupales = (HashMap<PlantillaCombo, Distribuidor>) objDistribucionesGrupales.clone();
        }
        if(this.objPlantillaComboDistribucionGrupalSeleccionada != null){
            ((ComponenteDistribuidor)objClon).objPlantillaComboDistribucionGrupalSeleccionada = (PlantillaCombo) objPlantillaComboDistribucionGrupalSeleccionada.clone();
        }
        if(this.objPlantillasComboDistribucionesGrupales != null){
            ((ComponenteDistribuidor)objClon).objPlantillasComboDistribucionesGrupales = (ArrayList<PlantillaCombo>) objPlantillasComboDistribucionesGrupales.clone();
        }        
        return objClon;
    }
    
    /**
     * Agrega una Linea de Código Fuente al Contexto actual Representado en la
     * Colección siempre y cuando no haya sido previamente ingresada.
     * @param objCollection Colección que representa el Contexto actual del Código
     * fuente.
     * @param obj Linea de Código Fuente que será agregada al Contexto 
     * siempre y cuando no haya sido previamente ingresada.
     */
    public void addSourceCode(ArrayList<CodeContextLine> objCollection, CodeContextLine obj){
        if(objCollection != null && obj != null){
            if(!objCollection.contains(obj)){
                if(!obj.isEmpty()){
                    objCollection.add(obj);
                }
                else{
                    UtilRender.printlnConsole(getName() + "> Linea de Código Fuente Vacia.", UtilRender.ACTION_NORMAL, false);
                }
                
            }   
            else{
                UtilRender.printlnConsole(getName() + "> Linea de Código Fuente Duplicada: " + obj.toString(), UtilRender.ACTION_NORMAL, false);
            }
        }
        else{
            UtilRender.printlnConsole(getName() + "> Objeto Nulo en la Generación de Linea de Código Fuente.", UtilRender.ACTION_NORMAL, false);
        }
    }
    
    /**
     * Agrega una Colección de Lineas de Código Fuente al Contexto actual Representado en la
     * Colección Inicial siempre y cuando no haya sido previamente ingresada.
     * @param objCollection Colección que representa el Contexto actual del Código
     * fuente.
     * @param objs Colección de Lineas de Código Fuente que serán agregadas al Contexto 
     * siempre y cuando no hayan sido previamente ingresadas.
     */
    public void addSourceCode(ArrayList<CodeContextLine> objCollection, ArrayList<CodeContextLine> objs){
        for(CodeContextLine obj : objs){
            addSourceCode(objCollection, obj);
        }        
    }
    
    /**
     * Determina si el <code>ComponenteDistribuidor</code> contiene en su representación
     * al menos un Control que Representará una Colección de Objetos por lo tanto
     * el Control que lo Represente debe utilizar un <code>java.swing.JScroll</code> para
     * su visualización.
     * @return boolean que determina si el <code>ComponenteDistribuidor</code> contiene en su representación
     * al menos un Control que Representará una Colección de Objetos.
     */
    public boolean isRequiredDefinitionJScroll(){
        for(Componente objComponente : this.getComponentesDistribuidos()){
            if(objComponente instanceof ComponenteGenerado){
                ComponenteGenerado objComponenteGenerado = (ComponenteGenerado) objComponente;
                if(objComponenteGenerado.isComponentCollection()){
                    return true;
                }
            }
        }
        return false;
    }
    
    /**
     * Determina si el <code>ComponenteDistribuidor</code> contiene en su representación
     * al menos un Control que Representará una Colección de Objetos Inicializada por un Modelo Estático.
     * @return boolean que determina si el <code>ComponenteDistribuidor</code> contiene en su representación
     * al menos un Control que Representará una Colección de Objetos Inicializada por un Modelo Estático.
     */
    public boolean isRequiredDefinitionStaticModelString(){
        for(Componente objComponente : this.getComponentesDistribuidos()){
            if(objComponente instanceof ComponenteGenerado){
                ComponenteGenerado objComponenteGenerado = (ComponenteGenerado) objComponente;
                if(objComponenteGenerado.isContainsStaticListModelString()){
                    return true;
                }
            }
        }
        return false;
    }
    
    /**
     * Determina si el <code>ComponenteDistribuidor</code> contiene en su representación
     * al menos un Control que requiere definición de Eventos.
     * @return boolean que determina si el <code>ComponenteDistribuidor</code> contiene en su representación
     * al menos un Control que requiere definición de Eventos.
     */
    public boolean isRequiredDefinitionEvents(){
        for(Componente objComponente : getComponentesDistribuidos()){            
            if(objComponente instanceof ComponenteDistribuidor){
                ComponenteDistribuidor objComponenteDistribuidor = (ComponenteDistribuidor) objComponente;
                if(objComponenteDistribuidor.isRequiredDefinitionEvents()){
                    return true;
                }
            }
            else if(objComponente instanceof ComponenteGenerado){
                ComponenteGenerado objComponenteGenerado = (ComponenteGenerado) objComponente;            
                if(objComponenteGenerado.isDefinedEvents()){
                    return true;
                }
            }            
        }
        return false;
    }
    
    /**
     * Determina si el <code>ComponenteDistribuidor</code> contiene en su representación
     * al menos un Componente Incluido.
     * @return boolean que determina si el <code>ComponenteDistribuidor</code> contiene en su representación
     * al menos un Componente Incluido.
     */
    public boolean isComponentesDistribuidos(){
        return !getComponentesDistribuidos().isEmpty();
    }
    
    /**
     * 
     * @param objSourceLinesCode
     */
    public void generateSourceCodeSyntaxImport(ArrayList<CodeContextLine> objSourceLinesCode) {
        generateSourceCodeSyntaxFaseImport(objSourceLinesCode);
    }
    
    /**
     * Genera el Código de las Importaciones de Clases utlizadas en la Definición
     * en un contexto local al Contenedor Actual.
     * @param objSourceLinesCode Colección que almacenará el Código Fuente Generado.
     */    
    public void generateSourceCodeSyntaxFaseImport(ArrayList<CodeContextLine> objSourceLinesCode){
        try{
            for(Componente objComponenteDistribuido : getComponentesDistribuidos()){
                if(objComponenteDistribuido instanceof ComponenteGenerado){
                    ComponenteGenerado objComponenteGenerado = (ComponenteGenerado) objComponenteDistribuido;
                    if(objComponenteGenerado.isIncluido()){
                        addSourceCode(objSourceLinesCode, objComponenteGenerado.generateSourceCodeSyntaxImport());
                        if(objComponenteGenerado.isComponentCollection()){
                            addSourceCode(objSourceLinesCode, objComponenteGenerado.generateSourceCodeSyntaxImportAsociateModel());
                        }
                    }                    
                }
                else if(objComponenteDistribuido instanceof ComponenteDistribuidor){
                    ComponenteDistribuidor objComponenteDistribuidor = (ComponenteDistribuidor) objComponenteDistribuido;
                    objComponenteDistribuidor.generateSourceCodeSyntaxFaseImport(objSourceLinesCode);
                }
            }                        
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorUnitario.class.getName()).log(Level.SEVERE, null, ex);
        }        
    }   
    
    /**
     * Genera el Código de las Definiciones de las Propiedades de Controles utlizadas en la Definición actual
     * en el contexto local.
     * @param objSourceLinesCode Colección que almacenará el Código Fuente Generado.
     */    
    public abstract void generateSourceCodeSyntaxFaseFieldDefinitionInstance(ArrayList<CodeContextLine> objSourceLinesCode);
    
    /**
     * Genera el Código de las Definiciones de Variables Clases utlizadas para procesos complementarios en la Definición actual
     * en el contexto local.
     * @param objSourceLinesCode Colección que almacenará el Código Fuente Generado.
     */    
    public abstract void generateSourceCodeSyntaxFaseFieldDefinitionClass(ArrayList<CodeContextLine> objSourceLinesCode);
    
    /**
     * Genera el Código de las Definiciones de Constantes utlizadas para procesos complementarios en la Definición actual
     * en el contexto local.
     * @param objSourceLinesCode Colección que almacenará el Código Fuente Generado.
     */    
    public abstract void generateSourceCodeSyntaxFaseFieldDefinitionConstant(ArrayList<CodeContextLine> objSourceLinesCode);
    
    /**
     * Genera el Código de las Inicializaciones de las Propiedades de Controles utlizadas en la Definición actual
     * en el contexto local.
     * @param objSourceLinesCode Colección que almacenará el Código Fuente Generado.
     */    
    public abstract void generateSourceCodeSyntaxFaseFieldInitializationInstance(ArrayList<CodeContextLine> objSourceLinesCode);
    
    /**
     * Genera el Código de las Inicializaciones de Variables Clases utlizadas para procesos complementarios en la Definición actual
     * en el contexto local.
     * @param objSourceLinesCode Colección que almacenará el Código Fuente Generado.
     */    
    public abstract void generateSourceCodeSyntaxFaseFieldInitializationClass(ArrayList<CodeContextLine> objSourceLinesCode);
    
    /**
     * Genera el Código de las Inicializaciones de las Propiedades de los Controles utlizados para procesos complementarios en la Definición actual
     * en el contexto local.
     * @param objSourceLinesCode Colección que almacenará el Código Fuente Generado.
     */    
    public abstract void generateSourceCodeSyntaxFaseFieldInitializationProperties(ArrayList<CodeContextLine> objSourceLinesCode);
    
    /**
     * Genera el Código de las Inicializaciones de las GridBagConstraints de los Controles utlizados para procesos complementarios en la Definición actual
     * en el contexto local.
     * @param objSourceLinesCode Colección que almacenará el Código Fuente Generado.
     */    
    public abstract void generateSourceCodeSyntaxFaseFieldInitializationGridBagConstraints(ArrayList<CodeContextLine> objSourceLinesCode);
    
    /**
     * Genera el Código de las Definiciones de los Eventos de los Controles utlizados para procesos complementarios en la Definición actual
     * en el contexto local.
     * @param objSourceLinesCode Colección que almacenará el Código Fuente Generado.
     */    
    public abstract void generateSourceCodeSyntaxFaseMethodDefinitionEvent(ArrayList<CodeContextLine> objSourceLinesCode);
    
    /**
     * Genera el Código de las Definiciones de las funciones de los Eventos de los Controles utlizados para procesos complementarios en la Definición actual
     * en el contexto local.
     * @param objSourceLinesCode Colección que almacenará el Código Fuente Generado.
     */    
    public abstract void generateSourceCodeSyntaxFaseMethodImplementEvent(ArrayList<CodeContextLine> objSourceLinesCode);
    
    /**
     * Genera el Código de los Métodos Set para las Propiedades de la Clase.
     * @param objSourceLinesCode Colección de Lineas que representan el Código Fuente Generado.
     */
    public abstract void generateSourceCodeSyntaxFaseMethodImplementFunctionSet(ArrayList<CodeContextLine> objSourceLinesCode);    
    
    /**
     * Genera el Código de Métodos Get para las Propiedades de la Clase.
     * @param objSourceLinesCode Colección de Lineas que representan el Código Fuente Generado.
     */
    public abstract void generateSourceCodeSyntaxFaseMethodImplementFunctionGet(ArrayList<CodeContextLine> objSourceLinesCode);

    @Override
    protected CodeContextLine generateSourceCodeSyntaxDefinition(boolean canonicalDefinition) {
        try{            
            String strDefinition = "private " + 
                ((canonicalDefinition) ? this.getStrPaquete() + "." + getName() : getName()) + " obj" + getName() + ";";
            CodeContextLine objSourceLineCode = new CodeContextLine(strDefinition);                    
            return objSourceLineCode;            
        }catch(java.lang.Exception ex){
            Logger.getLogger(Componente.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }
    
    @Override
    protected CodeContextLine generateSourceCodeSyntaxInitialization(boolean canonicalDefinition){
        try{            
            String strInitialization = "obj" + getName() + " = new " + 
                ((canonicalDefinition) ? this.getStrPaquete() + "." + getName() : getName()) + "();";
            CodeContextLine objSourceLineCode = new CodeContextLine(strInitialization);
            return objSourceLineCode;            
        }catch(java.lang.Exception ex){
            Logger.getLogger(Componente.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }    
    
    @Override
    public CodeContextLine generateSourceCodeSyntaxFunctionGetSet(boolean canonicalDefinition){        
        CodeContextLine objSourceLineCode = new CodeContextLine();       
        String strSimpleName = getName();
        String strCanonicalName = this.getStrPaquete() + "." + getName();
        objSourceLineCode.addElement("name", "obj" + getName());
        objSourceLineCode.addElement("classpath", (canonicalDefinition) ? strCanonicalName : strSimpleName);        
        return objSourceLineCode;
    }
    
    /**
     * Generar el Código de Inclusión de Componentes en el Tab que Representa el Contenedor actual.
     * @param objSourceCode Contexto de Generación de Código Actual.
     */
    public void generateSourceCodeSyntaxjComponentIntoTab(ArrayList<CodeContextLine> objSourceCode){  
        try{            
            for(Componente objComponente : getComponentesDistribuidos()){
                if(objComponente instanceof ComponenteDistribuidor){
                    ComponenteDistribuidor objComponenteDistribuidor = (ComponenteDistribuidor) objComponente;
                    String strAddjComponent = "jTabbedPaneComponentes.addTab(\"" + 
                            objComponenteDistribuidor.getStrTitulo() + 
                            "\", obj" + 
                            objComponenteDistribuidor.getName() + ");";
                    CodeContextLine objSourceLineCode = new CodeContextLine(strAddjComponent);
                    objSourceCode.add(objSourceLineCode);
                }
            }
        }catch(java.lang.Exception ex){
            Logger.getLogger(Componente.class.getName()).log(Level.SEVERE, null, ex);
        }        
    }
    
    /**
     * Generar el Código de Inclusión de Componentes en el Tab que Representa el Contenedor actual.
     * @param objSourceCode Contexto de Generación de Código Actual.
     */
    public void generateSourceCodeSyntaxContainerMenu(ArrayList<CodeContextLine> objSourceCode){  
        try{            
            for(Componente objComponente : getComponentesDistribuidos()){
                if(objComponente instanceof ComponenteDistribuidorGeneradorClaseCompleja ||                 
                        objComponente instanceof ComponenteDistribuidorIntegrador ||
                        objComponente instanceof ComponenteDistribuidorContenedor){
                    ComponenteDistribuidor objComponenteDistribuidor = (ComponenteDistribuidor) objComponente;
                    String strAddjComponent = "jTabbedPaneComponentes.addTab(\"" + 
                            objComponenteDistribuidor.getStrTitulo() + 
                            "\", obj" + 
                            objComponenteDistribuidor.getName() + ");";
                    CodeContextLine objSourceLineCode = new CodeContextLine(strAddjComponent);
                    objSourceCode.add(objSourceLineCode);
                }
            }
        }catch(java.lang.Exception ex){
            Logger.getLogger(Componente.class.getName()).log(Level.SEVERE, null, ex);
        }        
    }    
    
    /**
     * Devuelve la Definición del Paquete que contiene la Representación.
     * @return Cadena con la Definición del Paquete que contiene la Representación.
     */
    public String getObjPackage(){
        return "package " + getStrPaquete();        
    }

    /**
     * Devuelve el Menu asociado al Contenedor.
     * @return Menu asociado al Contenedor.
     */
    public MenuPane getObjMenu() {
        return objMenu;
    }

    /**
     * Establece el Menu asociado al Contenedor.     
     * @param objMenu 
     */
    public void setObjMenu(MenuPane objMenu) {
        this.objMenu = objMenu;
    }    
        
    /**
     * Determina si el Contenedor tiene asociado un Menu.
     * @return boolean que determina si el Contenedor tiene asociado un Menu.
     */
    public boolean hasMenuAvailable(){
        return objMenu != null;
    }
    
    /**
     * Genera el Código de las Declaraciones de las Variables que Representarán los Menus en un Contenedor.
     * @param objSourceLinesCode Colección que contiene las Lineas de Código.
     */
    public void generateSourceCodeSyntaxFaseMethodDefinitionVarMenuEvent(ArrayList<CodeContextLine> objSourceLinesCode) {
        try{
            if(isIncluido() && hasMenuAvailable()){
                addSourceCode(objSourceLinesCode, generateSourceCodeSyntaxCollectionMenuItemEvents(true));
            } 
            for(Componente objComponenteDistribuido : getComponentesDistribuidos()){
                if(objComponenteDistribuido instanceof ComponenteDistribuidorGeneradorClaseCompleja ||                 
                        objComponenteDistribuido instanceof ComponenteDistribuidorIntegrador ||
                        objComponenteDistribuido instanceof ComponenteDistribuidorContenedor){                    
                    ComponenteDistribuidor objComponenteDistribuidor = (ComponenteDistribuidor) objComponenteDistribuido;
                    if(objComponenteDistribuidor.isIncluido() && objComponenteDistribuidor.hasMenuAvailable()){
                        //addSourceCode(objSourceLinesCode, objComponenteDistribuidor.generateSourceCodeSyntaxCollectionMenuItemEvents(true));
                        generateSourceCodeSyntaxFaseMethodDefinitionVarMenuEvent(objSourceLinesCode, objComponenteDistribuidor);
                    }                    
                }
            }             
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidor.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    private void generateSourceCodeSyntaxFaseMethodDefinitionVarMenuEvent(ArrayList<CodeContextLine> objSourceLinesCode, ComponenteDistribuidor objComponenteDistribuidor) {
        try{
            if(objComponenteDistribuidor.isIncluido() && objComponenteDistribuidor.hasMenuAvailable()){
                addSourceCode(objSourceLinesCode, objComponenteDistribuidor.generateSourceCodeSyntaxCollectionMenuItemEvents(true));
            } 
            for(Componente objComponenteDistribuido : objComponenteDistribuidor.getComponentesDistribuidos()){
                if(objComponenteDistribuido instanceof ComponenteDistribuidorGeneradorClaseCompleja ||                 
                        objComponenteDistribuido instanceof ComponenteDistribuidorIntegrador ||
                        objComponenteDistribuido instanceof ComponenteDistribuidorContenedor){                    
                    ComponenteDistribuidor objComponenteDistribuidorInterno = (ComponenteDistribuidor) objComponenteDistribuido;
                    if(objComponenteDistribuidorInterno.isIncluido() && objComponenteDistribuidorInterno.hasMenuAvailable()){
                        //addSourceCode(objSourceLinesCode, objComponenteDistribuidorInterno.generateSourceCodeSyntaxCollectionMenuItemEvents(true));
                        generateSourceCodeSyntaxFaseMethodDefinitionVarMenuEvent(objSourceLinesCode, objComponenteDistribuidorInterno);
                    }                    
                }
            }             
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidor.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    /**
     * Genera el Código de las Definiciones de los Menus en un Contenedor.
     * @param objSourceLinesCode Colección que contiene las Lineas de Código.
     */
    public void generateSourceCodeSyntaxFaseMethodDefinitionMenuEvent(ArrayList<CodeContextLine> objSourceLinesCode) {
        try{
            if(isIncluido() && hasMenuAvailable()){
                addSourceCode(objSourceLinesCode, generateSourceCodeSyntaxCollectionMenuItemEvents(true));
            } 
            for(Componente objComponenteDistribuido : getComponentesDistribuidos()){
                if(objComponenteDistribuido instanceof ComponenteDistribuidorGeneradorClaseCompleja ||                 
                        objComponenteDistribuido instanceof ComponenteDistribuidorIntegrador ||
                        objComponenteDistribuido instanceof ComponenteDistribuidorContenedor){                    
                    ComponenteDistribuidor objComponenteDistribuidor = (ComponenteDistribuidor) objComponenteDistribuido;
                    if(objComponenteDistribuidor.isIncluido() && objComponenteDistribuidor.hasMenuAvailable()){
                        //addSourceCode(objSourceLinesCode, objComponenteDistribuidor.generateSourceCodeSyntaxCollectionMenuItemEvents(true));
                        generateSourceCodeSyntaxFaseMethodDefinitionMenuEvent(objSourceLinesCode, objComponenteDistribuidor);
                    }                    
                }
            }             
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidor.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    /**
     * 
     * @param objSourceLinesCode
     * @param objComponenteDistribuidor
     */
    public void generateSourceCodeSyntaxFaseMethodDefinitionMenuEvent(ArrayList<CodeContextLine> objSourceLinesCode, ComponenteDistribuidor objComponenteDistribuidor) {
        try{
            if(objComponenteDistribuidor.isIncluido() && objComponenteDistribuidor.hasMenuAvailable()){
                addSourceCode(objSourceLinesCode, objComponenteDistribuidor.generateSourceCodeSyntaxCollectionMenuItemEvents(true));
            } 
            for(Componente objComponenteDistribuido : objComponenteDistribuidor.getComponentesDistribuidos()){
                if(objComponenteDistribuido instanceof ComponenteDistribuidorGeneradorClaseCompleja ||                 
                        objComponenteDistribuido instanceof ComponenteDistribuidorIntegrador ||
                        objComponenteDistribuido instanceof ComponenteDistribuidorContenedor){                    
                    ComponenteDistribuidor objComponenteDistribuidorInterno = (ComponenteDistribuidor) objComponenteDistribuido;
                    if(objComponenteDistribuidorInterno.isIncluido() && objComponenteDistribuidorInterno.hasMenuAvailable()){
                        //addSourceCode(objSourceLinesCode, objComponenteDistribuidorInterno.generateSourceCodeSyntaxCollectionMenuItemEvents(true));
                        generateSourceCodeSyntaxFaseMethodDefinitionMenuEvent(objSourceLinesCode, objComponenteDistribuidorInterno);
                    }                    
                }
            }             
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidor.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    /**
     * 
     * @param objSourceLinesCode
     */
    public void generateSourceCodeSyntaxFaseMethodImplementMenuEvent(ArrayList<CodeContextLine> objSourceLinesCode) {
        try{
            if(isIncluido() && hasMenuAvailable()){
                addSourceCode(objSourceLinesCode, generateSourceCodeSyntaxCollectionMenuItemEvents(true));
            } 
            for(Componente objComponenteDistribuido : getComponentesDistribuidos()){
                if(objComponenteDistribuido instanceof ComponenteDistribuidorGeneradorClaseCompleja ||                 
                        objComponenteDistribuido instanceof ComponenteDistribuidorIntegrador ||
                        objComponenteDistribuido instanceof ComponenteDistribuidorContenedor){                    
                    ComponenteDistribuidor objComponenteDistribuidor = (ComponenteDistribuidor) objComponenteDistribuido;
                    if(objComponenteDistribuidor.isIncluido() && objComponenteDistribuidor.hasMenuAvailable()){
                        //addSourceCode(objSourceLinesCode, objComponenteDistribuidor.generateSourceCodeSyntaxCollectionMenuItemEvents(true));
                        generateSourceCodeSyntaxFaseMethodImplementMenuEvent(objSourceLinesCode, objComponenteDistribuidor);
                    }                    
                }
            }
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidor.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    /**
     * 
     * @param objSourceLinesCode
     * @param objComponenteDistribuidor
     */
    public void generateSourceCodeSyntaxFaseMethodImplementMenuEvent(ArrayList<CodeContextLine> objSourceLinesCode, ComponenteDistribuidor objComponenteDistribuidor) {
        try{
            if(objComponenteDistribuidor.isIncluido() && objComponenteDistribuidor.hasMenuAvailable()){
                addSourceCode(objSourceLinesCode, objComponenteDistribuidor.generateSourceCodeSyntaxCollectionMenuItemEvents(true));
            } 
            for(Componente objComponenteDistribuido : objComponenteDistribuidor.getComponentesDistribuidos()){
                if(objComponenteDistribuido instanceof ComponenteDistribuidorGeneradorClaseCompleja ||                 
                        objComponenteDistribuido instanceof ComponenteDistribuidorIntegrador ||
                        objComponenteDistribuido instanceof ComponenteDistribuidorContenedor){                    
                    ComponenteDistribuidor objComponenteDistribuidorInterno = (ComponenteDistribuidor) objComponenteDistribuido;
                    if(objComponenteDistribuidorInterno.isIncluido() && objComponenteDistribuidorInterno.hasMenuAvailable()){
                        //addSourceCode(objSourceLinesCode, objComponenteDistribuidorInterno.generateSourceCodeSyntaxCollectionMenuItemEvents(true));
                        generateSourceCodeSyntaxFaseMethodImplementMenuEvent(objSourceLinesCode, objComponenteDistribuidorInterno);
                    }                    
                }
            }
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidor.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    /**
     * 
     * @param objSourceLinesCode
     */
    public void generateSourceCodeSyntaxFaseMethodImplementMenuParentEvent(ArrayList<CodeContextLine> objSourceLinesCode) {
        try{
            if(isIncluido() && hasMenuAvailable()){
                addSourceCode(objSourceLinesCode, generateSourceCodeSyntaxDefinitionMenuEvents(true));
            } 
            for(Componente objComponenteDistribuido : getComponentesDistribuidos()){
                if(objComponenteDistribuido instanceof ComponenteDistribuidorGeneradorClaseCompleja ||                 
                        objComponenteDistribuido instanceof ComponenteDistribuidorIntegrador ||
                        objComponenteDistribuido instanceof ComponenteDistribuidorContenedor){                    
                    ComponenteDistribuidor objComponenteDistribuidor = (ComponenteDistribuidor) objComponenteDistribuido;
                    if(objComponenteDistribuidor.isIncluido() && objComponenteDistribuidor.hasMenuAvailable()){
                        //addSourceCode(objSourceLinesCode, objComponenteDistribuidor.generateSourceCodeSyntaxDefinitionMenuEvents(true));
                        generateSourceCodeSyntaxFaseMethodImplementMenuParentEvent(objSourceLinesCode, objComponenteDistribuidor);
                    }                    
                }
            }
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidor.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    /**
     * 
     * @param objSourceLinesCode
     * @param objComponenteDistribuidor
     */
    public void generateSourceCodeSyntaxFaseMethodImplementMenuParentEvent(ArrayList<CodeContextLine> objSourceLinesCode, ComponenteDistribuidor objComponenteDistribuidor) {
        try{
            if(objComponenteDistribuidor.isIncluido() && objComponenteDistribuidor.hasMenuAvailable()){
                addSourceCode(objSourceLinesCode, objComponenteDistribuidor.generateSourceCodeSyntaxDefinitionMenuEvents(true));
            } 
            for(Componente objComponenteDistribuido : objComponenteDistribuidor.getComponentesDistribuidos()){
                if(objComponenteDistribuido instanceof ComponenteDistribuidorGeneradorClaseCompleja ||                 
                        objComponenteDistribuido instanceof ComponenteDistribuidorIntegrador ||
                        objComponenteDistribuido instanceof ComponenteDistribuidorContenedor){                    
                    ComponenteDistribuidor objComponenteDistribuidorInterno = (ComponenteDistribuidor) objComponenteDistribuido;
                    if(objComponenteDistribuidorInterno.isIncluido() && objComponenteDistribuidorInterno.hasMenuAvailable()){
                        //addSourceCode(objSourceLinesCode, objComponenteDistribuidorInterno.generateSourceCodeSyntaxDefinitionMenuEvents(true));
                        generateSourceCodeSyntaxFaseMethodImplementMenuParentEvent(objSourceLinesCode, objComponenteDistribuidorInterno);
                    }                    
                }
            }
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidor.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    /**
     * 
     * @param canonicalDefinition
     * @return
     */
    public ArrayList<CodeContextLine> generateSourceCodeSyntaxCollectionMenuItemEvents(boolean canonicalDefinition){
        try{        
            EventoOyente objEvento = GeneradorComponentes.findEventoOyente("Click");            
            ArrayList<CodeContextLine> objSourceCode = new ArrayList<CodeContextLine>();
            for(OptionMenuPane objOptionMenu : objMenu.getObjOptions()){
                objSourceCode.add(generateSourceCodeSyntaxDefinitionMenuItemEvent(objOptionMenu, objEvento));
            }                        
            return objSourceCode;
        }catch(java.lang.Exception ex){
            Logger.getLogger(Componente.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }
    
    /**
     * 
     * @param canonicalDefinition
     * @return
     */
    public CodeContextLine generateSourceCodeSyntaxDefinitionMenuEvents(boolean canonicalDefinition){
        try{        
            if(hasMenuAvailable()){            
                CodeContextLine objSourceLineCode = new CodeContextLine();
                objSourceLineCode.addElement("menu", "menu" + getName());
                objSourceLineCode.addElement("name", objMenu.getStrName());
                objSourceLineCode.addElement("title", objMenu.getStrTitle());
                return objSourceLineCode;                
            }
        }catch(java.lang.Exception ex){
            Logger.getLogger(Componente.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }
    
    /**
     * 
     * @param objOptionMenu
     * @param objEvento
     * @return
     */
    public CodeContextLine generateSourceCodeSyntaxDefinitionMenuItemEvent(OptionMenuPane objOptionMenu, EventoOyente objEvento){
        Oyente objOyente = objEvento.getObjOyente();
        CodeContextLine objSourceLineCode = new CodeContextLine();        
        objSourceLineCode.addElement("menu", objMenu.getStrName());
        objSourceLineCode.addElement("label", objOptionMenu.getStrLabel());
        objSourceLineCode.addElement("name", objOptionMenu.getStrCommand());
        objSourceLineCode.addElement("interface", objOyente.getStrInterfaz());
        objSourceLineCode.addElement("package", objOyente.getStrPaquete());
        
        String strEvento = objEvento.getStrNombre();
        strEvento = Character.toUpperCase(strEvento.charAt(0)) + strEvento.substring(1);
        objSourceLineCode.addElement("method", strEvento);
        objSourceLineCode.addElement("event", objEvento.getStrNombre());
        objSourceLineCode.addElement("action", objOyente.getStrAccion());
        objSourceLineCode.addElement("evt", objOyente.getStrVar());        
        return objSourceLineCode;
    }
    
    /**
     * 
     * @param strName
     * @param mode
     * @return
     */
    public boolean isUsedNameMenu(String strName, boolean mode){
        if(isIncluido() && hasMenuAvailable()){
           if(mode){
               if(getObjMenu().getStrName().equals(strName)){
                   return true;
               }
           } 
           else{
               for(OptionMenuPane objOpc : getObjMenu().getObjOptions()){
                   if(objOpc.getStrCommand().equals(strName)){
                       return true;
                   }
               }
           }
        }
        for(Componente objComponente : getComponentesDistribuidos()){
            if(objComponente instanceof ComponenteDistribuidor){
                ComponenteDistribuidor objComponenteDistribuidorInterno = (ComponenteDistribuidor) objComponente;
                if(objComponenteDistribuidorInterno.isIncluido() && objComponenteDistribuidorInterno.hasMenuAvailable()){
                    return isUsedNameMenu(strName, mode, objComponenteDistribuidorInterno);
                }
            }
        }
        return false;    
    }
    
    private boolean isUsedNameMenu(String strName, boolean mode, ComponenteDistribuidor objComponenteDistribuidor){
        if(objComponenteDistribuidor.isIncluido() && objComponenteDistribuidor.hasMenuAvailable()){
           if(mode){
               if(objComponenteDistribuidor.getObjMenu().getStrName().equals(strName)){
                   return true;
               }
           } 
           else{
               for(OptionMenuPane objOpc : objComponenteDistribuidor.getObjMenu().getObjOptions()){
                   if(objOpc.getStrCommand().equals(strName)){
                       return true;
                   }
               }
           }
        }
        for(Componente objComponente : objComponenteDistribuidor.getComponentesDistribuidos()){
            if(objComponente instanceof ComponenteDistribuidor){
                ComponenteDistribuidor objComponenteDistribuidorInterno = (ComponenteDistribuidor) objComponente;
                if(objComponenteDistribuidorInterno.isIncluido() && objComponenteDistribuidorInterno.hasMenuAvailable()){
                    return isUsedNameMenu(strName, mode, objComponenteDistribuidorInterno);
                }
            }
        }
        return false;    
    }
}